package servidorIndice.controlador;

import java.sql.*;
import java.util.ArrayList;
/**
 * Clase de tipo controlador que funciona como conector a la base de datos
 * donde para este caso se emplea el motor de SQLITE
 * @author Jorge Hernán Londoño Echeverri narzyx@gmail.com Hayner Benavides Moreno hayner2005@gmail.com
 */
public class RegistrosControlador {
    private Connection conn;
	private Statement stm;

	public RegistrosControlador(){
		conn=null;
		stm=null;
	}

	public Boolean esSentenciaNula(){
		if(stm==null)
			return true;
		return false;
	}

	public Boolean esConexionNula(){
		if(conn==null){
			return true;
		}
		return false;
	}

    public boolean init(String motor){
        String cadena=encontrarDriver("sqlite");
		if(!cadena.equals("sqlite")){
			conectar(cadena);
			if(!esConexionNula())	{
				crearSentencia();
                if(!esSentenciaNula())
                    return true;
			}
		}

        return false;
    }

	public String encontrarDriver(String motor){

			String cadenaConexion="";
			try{
				if(motor.equals("sqlite")){
					Class.forName("org.sqlite.JDBC");
					cadenaConexion="jdbc:sqlite:bd_asd/indices_db.sqlite";
				}
			}
			catch(ClassNotFoundException cnfe){
				System.out.println("No se ha encontrado el driver JDBC de "+motor+
								   " "+cnfe.getMessage());

			}
			return cadenaConexion;
	}

	public void conectar(String cadena){
		this.conn=null;
		try{

			this.conn= DriverManager.getConnection(cadena);
		}
		catch(SQLException sqle){
			System.out.println("No se pudo realizar la conexion: "+sqle.getMessage());
		}
	}

	public void crearSentencia(){
		stm=null;
		try{
            stm=conn.createStatement();
		}
		catch(SQLException sqle){
			System.out.println("No se logro crear la sentencia");
		}
	}

	public void insertarRegistro(Registro registro){
        String sql = "INSERT INTO registros VALUES('"+registro.getIndice()+"', '" +
        registro.getIp() + "', '" + registro.getAccion() +
        "', '" + registro.getPuerto() + "')";
        try
        {
        // Retorna un valor entero que indica el número de
        int control = stm.executeUpdate(sql);
        //System.out.println("Ejecutando ... " + sql +" ... " + control);
        }
        catch(SQLException e4)
        {
            System.out.println("Error ejecutando \"" + sql +"\": " + e4.getMessage());
        }
	}

    public void actualizarRegistro(Registro registro){
        String sql = "UPDATE registros SET ip='" + registro.getIp() +
        "', accion='" + registro.getAccion() +
        "', puerto=" + registro.getPuerto() + " where id='"+registro.getIndice()+"'";
        try
        {
        // Retorna un valor entero que indica el número de
        int control = stm.executeUpdate(sql);
        //System.out.println("Ejecutando ... " + sql + " ... " + control);
        }
        catch(SQLException e4)
        {
            System.out.println("Error ejecutando \"" + sql +"\": " + e4.getMessage());
        }
    }

	public void eliminarRegistro(int indice){
		String sql3 = "DELETE FROM registros WHERE id ='"+indice+"'";
		try
		{
			int control = stm.executeUpdate(sql3);
			//System.out.println("Ejecutando ... " + sql3 +" ... " + control);
		}
		catch(SQLException e6)
		{
			System.out.println("Error ejecutando \"" + sql3 +"\": " + e6.getMessage());
		}
	}

    public void eliminarRegistro(){
		String sql3 = "DELETE FROM registros ";
		try
		{
			int control = stm.executeUpdate(sql3);
			//System.out.println("Ejecutando ... " + sql3 + " ... " + control);
		}
		catch(SQLException e6)
		{
			//System.out.println("Error ejecutando \"" + sql3 + "\": " + e6.getMessage());
		}
	}

    public boolean isRegistro(String indice){
        ResultSet rs = null;
		String sql = "SELECT count(id) as total FROM registros WHERE id='"+indice+"' GROUP BY id";
		try
		{
			// Retorna un objeto ResultSet con la confirmación de
			// la existencia de un registro identificado con el valor del parametro indice
			// ejecutada.
			rs = stm.executeQuery(sql);
			while (rs.next())
			{
                if(rs.getInt("total")>0){
                    rs.close();
                    return true;
                }
                else{
                    rs.close();
                    return false;
                }			
			}
			rs.close();
		}
		catch(SQLException e7)
		{
			System.out.println("Error obteniendo resultado: " + e7.getMessage());
		}
        
        return false;
    }

    public boolean isDireccionPuertoDuplicada(String ip, String puerto){
        ResultSet rs = null;
		String sql = "SELECT count(id) as total FROM registros WHERE ip='"+ip+"' and puerto='"+puerto+"' GROUP BY id";
		try
		{
			// Retorna un objeto ResultSet con la confirmación de
			// la existencia de un registro identificado con el valor del parametro indice
			// ejecutada.
			rs = stm.executeQuery(sql);
			while (rs.next())
			{
                if(rs.getInt("total")>0){
                    rs.close();
                    return true;
                }
                else{
                    rs.close();
                    return false;
                }
			}
			rs.close();
		}
		catch(SQLException e7)
		{
			System.out.println("Error obteniendo resultado: " +
			e7.getMessage());
		}

        return false;
    }

	public ArrayList<Registro> buscar(){
		ResultSet rs = null;
        ArrayList<Registro> lista = new ArrayList<Registro>();
		String sql = "SELECT * FROM registros ORDER BY id ASC";
		try
		{
			// Retorna un objeto ResultSet con la información del
			// conjunto de tuplas resultado de la consulta recién
			// ejecutada.
			rs = stm.executeQuery(sql);
			while (rs.next())
			{
                Registro registro = new Registro(rs.getString("ip"), rs.getString("puerto"));
                registro.setAccion(rs.getString("accion"));
                registro.setIndice(rs.getString("id"));

                lista.add(registro);
				
			}
			rs.close();
		}
		catch(SQLException e7)
		{
			System.out.println("Error obteniendo resultado: " +
			e7.getMessage());
		}

        return lista;
	}

    public ArrayList<Registro> buscarExcepto(String indice){
		ResultSet rs = null;
        ArrayList<Registro> lista = new ArrayList<Registro>();
		String sql = "SELECT * FROM registros WHERE id <> '"+indice+"' ORDER BY id ASC";
		try
		{
			// Retorna un objeto ResultSet con la información del
			// conjunto de tuplas resultado de la consulta recién
			// ejecutada.
			rs = stm.executeQuery(sql);
			while (rs.next())
			{
                Registro registro = new Registro(rs.getString("ip"), rs.getString("puerto"));
                registro.setAccion(rs.getString("accion"));
                registro.setIndice(rs.getString("id"));

                lista.add(registro);
			}
			rs.close();
		}
		catch(SQLException e7)
		{
			System.out.println("Error obteniendo resultado: " +
			e7.getMessage());
		}

        return lista;
	}

    public ArrayList<Registro> buscar(String indice){
		ResultSet rs = null;
        ArrayList<Registro> lista = new ArrayList<Registro>();
		String sql = "SELECT * FROM registros WHERE id = '"+indice+"' ORDER BY id ASC";
		try
		{
			// Retorna un objeto ResultSet con la información del
			// conjunto de tuplas resultado de la consulta recién
			// ejecutada.
			rs = stm.executeQuery(sql);
			while (rs.next())
			{
                Registro registro = new Registro(rs.getString("ip"), rs.getString("puerto"));
                registro.setAccion(rs.getString("accion"));
                registro.setIndice(rs.getString("id"));

                lista.add(registro);
			}
			rs.close();
		}
		catch(SQLException e7)
		{
			System.out.println("Error obteniendo resultado: " +
			e7.getMessage());
		}

        return lista;
	}

	public void cerrar(){
		try
		{
			conn.close();
		}
		catch(SQLException e8)
		{
			System.out.println("Error cerrando la conexion: " +
			e8.getMessage());
		}
	}


}
